home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-01-28 | 8.8 KB | 361 lines | [TEXT/BOBO] |
- /*/*************************************************************************
- ** Apple Macintosh Developer Technical Support
- **
- ** Macintosh Disk Driver Gestalt Sample
- **
- ** by Vinne Moscaritolo, <vinnie@apple.com>
- ** Apple Developer Technical Support
- **
- ** Created from as much sample code I could find.
- ** with much help from Martin Minow
- **
- ** " Good Artists Imitate, Great Artist Steal "
- **
- ** File: DriverGestalt Demo.c
- **
- ** Copyright © 1996 Apple Computer, Inc.
- ** All rights reserved.
- **
- ** You may incorporate this sample code into your applications without
- ** restriction, though the sample code has been provided "AS IS" and the
- ** responsibility for its operation is 100% yours. However, what you are
- ** not permitted to do is to redistribute the source as "DSC Sample Code"
- ** after having made changes. If you're going to re-distribute the source,
- ** we require that you make it clear in the source that the code was
- ** descended from Apple Sample Code, but that you've made changes.
- **
- **************************************************************************/
-
-
-
- //------------------------------------------------------------------------------
- ------
- #pragma mark Includes
- //------------------------------------------------------------------------------
- ------
- #include <stdio.h>
- #include <stdlib.h>
-
- #include <DriverGestalt.h>
-
- //------------------------------------------------------------------------------
- ------
- #pragma mark Defines
- //------------------------------------------------------------------------------
- ------
-
- #define CLEAR(what) do { \
- register Ptr _ptr = (Ptr) &what; \
- register Size _len = sizeof what; \
- for (; _len > 0; --_len)
- \
- *_ptr++ = 0;
- \
- } while (0)
-
-
- //------------------------------------------------------------------------------
- ------
- #pragma mark DriverGestalt Info & Structures
- //------------------------------------------------------------------------------
- ------
-
- enum {
- kdgFlush = 'flus' /*
- can disk driver flush */
- };
-
- struct DriverGestaltFlushResponse {
- Boolean canFlush;
- Boolean needsFlush;
- UInt8 pad[2];
- };
- typedef struct DriverGestaltFlushResponse DriverGestaltFlushResponse;
-
- typedef struct DriverGestaltSyncResponse DriverGestaltSyncResponse;
-
- struct DriverGestaltVersResponse
- {
- NumVersion driverVersion;
- };
- typedef struct DriverGestaltVersResponse DriverGestaltVersResponse;
-
-
- union DriverGestaltInfo
- {
- DriverGestaltSyncResponse sync;
- DriverGestaltBootResponse boot;
- DriverGestaltDevTResponse devt;
- DriverGestaltIntfResponse intf;
- DriverGestaltVersResponse vers;
- DriverGestaltEjectResponse ejec;
- DriverGestaltPowerResponse powr;
- DriverGestaltFlushResponse flus;
- UInt32 i;
- };
- typedef union DriverGestaltInfo DriverGestaltInfo;
-
- //------------------------------------------------------------------------------
- ------
- #pragma mark Prototypes
- //------------------------------------------------------------------------------
- ------
-
-
- void DisplayAllDriveInfo (void);
-
- void DisplayDriverGestaltInfo (short refNum, short device);
-
- OSErr DoDriverGestalt (short
- driverRefnum,
- short
- driveNumber,
- OSType
- gestaltSelector,
-
- DriverGestaltInfo *response );
-
- char* DrvrRefToName (short refNum);
- void PrintNumVersion (char *label, NumVersion version );
-
-
- // ---------------------------------------------------------------------------
- void main (void)
- // ---------------------------------------------------------------------------
- {
- DisplayAllDriveInfo();
- }
-
-
- // ---------------------------------------------------------------------------
- void DisplayAllDriveInfo (void)
- // ---------------------------------------------------------------------------
- //
- // Display information ATA Driver GestaltInfo
- //
- {
- register DrvQEl *drvQElPtr;
- char* drvrNamePtr;
- short notused;
- OSErr status;
-
-
- #define DQEL (*drvQElPtr)
- drvQElPtr = (DrvQEl *) GetDrvQHdr()->qHead;
-
- printf("Disk Drive Queue Information:\n\n");
- while (drvQElPtr != NULL) {
-
- drvrNamePtr = DrvrRefToName(DQEL.dQRefNum);
-
- printf("Drive: %d %#s (%d) ",
- (int) DQEL.dQDrive,
- drvrNamePtr,DQEL.dQRefNum);
-
- switch (DQEL.qType) {
- case 0:
- printf(
- "%lu blocks (small drive)\n",
- (unsigned long) DQEL.dQDrvSz
- );
- break;
- case 1:
- printf(
- "%lu blocks\n",
- ((unsigned long) DQEL.dQDrvSz)
- + (((unsigned long) DQEL.dQDrvSz2) * 0x10000L)
- );
- break;
- case 3:
- printf(
- "%lu blocks (MFS present)\n",
- ((unsigned long) DQEL.dQDrvSz)
- );
- break;
- default:
- printf(
- "%lu %lu (unknown queue type)\n",
- ((unsigned long) DQEL.dQDrvSz),
- ((unsigned long) DQEL.dQDrvSz2)
- );
- break;
- }
-
- // Open driver
- status = OpenDriver((ConstStr255Param)drvrNamePtr, ¬used);
- if (status != noErr) {
- printf("Cannot open %#s Error: %d\n", (int) status);
- exit(EXIT_FAILURE);
- }
-
- DisplayDriverGestaltInfo(DQEL.dQRefNum, DQEL.dQDrive);
- drvQElPtr = (DrvQEl *) DQEL.qLink;
- }
- #undef DQEL
- }
-
-
-
-
- // ---------------------------------------------------------------------------
- void DisplayDriverGestaltInfo (short refNum, short driveNum)
- // ---------------------------------------------------------------------------
- //
- // Display DriverGestalt information.
- //
- {
- OSErr status;
- DriverGestaltInfo response;
-
- // display driver version
- status = DoDriverGestalt(refNum,driveNum, kdgVersion,
- &response);
- if (status == noErr)
- PrintNumVersion("\t'vers' - version:",
- response.vers.driverVersion);
-
-
- // display device type
- status = DoDriverGestalt(refNum, driveNum, kdgDeviceType,
- &response);
- if (status == noErr)
- printf("\t'devt' - Device:\t'%.4s'\n",
- (char *) &response.devt.deviceType
- );
-
-
- // display API info
- status = DoDriverGestalt(refNum, driveNum, kdgInterface,
- &response);
- if (status == noErr)
- printf("\t'intf' - Interface:\t'%.4s'\n",
- (char *) &response.intf.interfaceType
- );
-
- // display boot record
- status = DoDriverGestalt(refNum, driveNum, kdgBoot, &response);
- if (status == noErr)
- printf("\t'boot' - Boot PRAM:\t%08lx\n",
- (* ((unsigned long *) &response))
- );
-
- // display sync info
- status = DoDriverGestalt(refNum, driveNum, kdgSync,
- &response);
- if (status == noErr)
- printf("\t'sync' - Driver is %s \n",
-
- (response.sync.behavesSynchronously)?"synchronous":"asynchronous");
-
-
- // display driver flush capablities
- status = DoDriverGestalt(refNum, driveNum, kdgFlush,
- &response);
- if (status == noErr)
- printf("\t'flus' - Driver %s flush \n",
-
- (response.flus.canFlush)?"supports":"doesn't support");
-
- // display power info
- status = DoDriverGestalt(refNum, driveNum,
- kdgSupportsPowerCtl, &response);
- if (status == noErr) {
- printf("\t'psup' - Driver %s power
- switching\n",
-
- (response.powr.powerValue)?"supports":"doesn't support");
-
- status = DoDriverGestalt(refNum, driveNum, kdgMin3VPower,
- &response);
- if (status == noErr)
- printf("\t'pmx3' - 3.3V power consumption %d
- microWatts \n",
- (char *) &response.powr.powerValue);
- }
-
-
- printf("\n");
- }
-
-
- // ---------------------------------------------------------------------------
- OSErr DoDriverGestalt (short
- driverRefnum,
- short
- driveNumber,
- OSType
- gestaltSelector,
-
- DriverGestaltInfo *response )
- // ---------------------------------------------------------------------------
- //
- // Do Driver Gestalt Call
- //
- {
- DriverGestaltParam pb;
- OSErr status;
-
- CLEAR(pb);
- pb.ioVRefNum = driveNumber;
- pb.ioCRefNum = driverRefnum;
- pb.csCode = kDriverGestaltCode;
- pb.driverGestaltSelector = gestaltSelector;
-
- status = PBStatusSync((ParmBlkPtr) &pb);
-
- if (status == noErr)
- response->i = pb.driverGestaltResponse;
- // else printf("error %d\n",status);
- return (status);
- }
-
- // ---------------------------------------------------------------------------
- char* DrvrRefToName(short refNum)
- // ---------------------------------------------------------------------------
- //
- // lookup driver name in table
- //
-
- {
- AuxDCEHandle* UTable = (AuxDCEHandle*)
- LMGetUTableBase();
- DCtlPtr dctl;
- Ptr p;
-
- if(!refNum) return ((char*) "\p<none>");
-
- dctl = (DCtlPtr) *UTable[~refNum];
- p = dctl->dCtlDriver;
- if( dctl->dCtlFlags & 0x0040) p = (void*) *p;
-
- return ( p?(char*) (p+18):(char*)"\p-Purged-");
- }
-
- // ---------------------------------------------------------------------------
- void PrintNumVersion (char *label, NumVersion version )
- // ---------------------------------------------------------------------------
- //
- // Decode version number info
- //
- {
- char *stage;
-
- switch (version.stage) {
- case developStage: stage = "d"; break;
- case alphaStage: stage = "a"; break;
- case betaStage: stage = "b"; break;
- case finalStage: stage = ""; break;
- default: stage = "?"; break;
-
- }
- printf("%s %d.%d.%d",
- label,
- version.majorRev,
- (version.minorAndBugRev>>4), (version.minorAndBugRev & 0xf),
- stage);
- if(version.stage != finalStage) printf(".%d",version.nonRelRev);
-
- printf(" (hex %08lx)\n", (* ((unsigned long *) &version)));
- }
-
-